From 091e799a840c8af9a9affb41bade805375182a25 Mon Sep 17 00:00:00 2001 From: "kaf24@scramble.cl.cam.ac.uk" Date: Thu, 10 Feb 2005 18:08:59 +0000 Subject: [PATCH] bitkeeper revision 1.1159.1.568 (420ba33bo4Ly13qI5cHgZttHha5_-g) Change do_set_callbacks hypercall for x86/64 to not take any selector values, but to take a syscall_entry point. Signed-off-by: keir.fraser@cl.cam.ac.uk --- xen/arch/x86/traps.c | 19 ------------------- xen/arch/x86/x86_32/traps.c | 18 ++++++++++++++++++ xen/arch/x86/x86_64/asm-offsets.c | 3 +-- xen/arch/x86/x86_64/entry.S | 15 +++++++++------ xen/arch/x86/x86_64/traps.c | 13 +++++++++++++ xen/include/asm-x86/domain.h | 7 +++++-- 6 files changed, 46 insertions(+), 29 deletions(-) diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 9e91a48540..44b1366105 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -808,25 +808,6 @@ long do_set_trap_table(trap_info_t *traps) } -long do_set_callbacks(unsigned long event_selector, - unsigned long event_address, - unsigned long failsafe_selector, - unsigned long failsafe_address) -{ - struct exec_domain *d = current; - - if ( !VALID_CODESEL(event_selector) || !VALID_CODESEL(failsafe_selector) ) - return -EPERM; - - d->arch.event_selector = event_selector; - d->arch.event_address = event_address; - d->arch.failsafe_selector = failsafe_selector; - d->arch.failsafe_address = failsafe_address; - - return 0; -} - - long do_fpu_taskswitch(void) { set_bit(EDF_GUEST_STTS, ¤t->ed_flags); diff --git a/xen/arch/x86/x86_32/traps.c b/xen/arch/x86/x86_32/traps.c index ef8cc53c72..68463a253c 100644 --- a/xen/arch/x86/x86_32/traps.c +++ b/xen/arch/x86/x86_32/traps.c @@ -274,3 +274,21 @@ long do_set_fast_trap(int idx) { return set_fast_trap(current, idx); } + +long do_set_callbacks(unsigned long event_selector, + unsigned long event_address, + unsigned long failsafe_selector, + unsigned long failsafe_address) +{ + struct exec_domain *d = current; + + if ( !VALID_CODESEL(event_selector) || !VALID_CODESEL(failsafe_selector) ) + return -EPERM; + + d->arch.event_selector = event_selector; + d->arch.event_address = event_address; + d->arch.failsafe_selector = failsafe_selector; + d->arch.failsafe_address = failsafe_address; + + return 0; +} diff --git a/xen/arch/x86/x86_64/asm-offsets.c b/xen/arch/x86/x86_64/asm-offsets.c index fa816d2610..309afbc6ee 100644 --- a/xen/arch/x86/x86_64/asm-offsets.c +++ b/xen/arch/x86/x86_64/asm-offsets.c @@ -43,10 +43,9 @@ void __dummy__(void) OFFSET(EDOMAIN_processor, struct exec_domain, processor); OFFSET(EDOMAIN_vcpu_info, struct exec_domain, vcpu_info); - OFFSET(EDOMAIN_event_sel, struct exec_domain, arch.event_selector); OFFSET(EDOMAIN_event_addr, struct exec_domain, arch.event_address); - OFFSET(EDOMAIN_failsafe_sel, struct exec_domain, arch.failsafe_selector); OFFSET(EDOMAIN_failsafe_addr, struct exec_domain, arch.failsafe_address); + OFFSET(EDOMAIN_syscall_addr, struct exec_domain, arch.syscall_address); OFFSET(EDOMAIN_trap_bounce, struct exec_domain, arch.trap_bounce); OFFSET(EDOMAIN_thread_flags, struct exec_domain, arch.flags); OFFSET(EDOMAIN_kernel_sp, struct exec_domain, arch.kernel_sp); diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S index 8c00a685ad..ccd792fd52 100644 --- a/xen/arch/x86/x86_64/entry.S +++ b/xen/arch/x86/x86_64/entry.S @@ -104,12 +104,15 @@ ENTRY(syscall_enter) movl $TRAP_syscall,4(%rsp) SAVE_ALL GET_CURRENT(%rbx) - bts $_TF_kernel_mode,EDOMAIN_thread_flags(%rbx) - jc hypercall - swapgs - movq %rbx,%rdi - call SYMBOL_NAME(write_ptbase) - jmp restore_all_guest + testb $TF_kernel_mode,EDOMAIN_thread_flags(%rbx) + jnz hypercall + + leaq EDOMAIN_trap_bounce(%rbx),%rdx + movq EDOMAIN_syscall_addr(%rbx),%rax + movq %rax,TRAPBOUNCE_eip(%rdx) + movw $0,TRAPBOUNCE_flags(%rdx) + pushq restore_all_guest(%rip) + jmp create_bounce_frame hypercall: sti diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c index 27143d8cf9..cbd96c0731 100644 --- a/xen/arch/x86/x86_64/traps.c +++ b/xen/arch/x86/x86_64/traps.c @@ -256,3 +256,16 @@ void *decode_reg(struct xen_regs *regs, u8 b) return NULL; } + +long do_set_callbacks(unsigned long event_address, + unsigned long failsafe_address, + unsigned long syscall_address) +{ + struct exec_domain *d = current; + + d->arch.event_address = event_address; + d->arch.failsafe_address = failsafe_address; + d->arch.syscall_address = syscall_address; + + return 0; +} diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h index d8821f50e3..32205b63b4 100644 --- a/xen/include/asm-x86/domain.h +++ b/xen/include/asm-x86/domain.h @@ -68,12 +68,15 @@ struct arch_exec_domain * for segment registers %ds, %es, %fs and %gs: * %ds, %es, %fs, %gs, %eip, %cs, %eflags [, %oldesp, %oldss] */ - unsigned long event_selector; /* entry CS */ + + unsigned long event_selector; /* entry CS (x86/32 only) */ unsigned long event_address; /* entry EIP */ - unsigned long failsafe_selector; /* entry CS */ + unsigned long failsafe_selector; /* entry CS (x86/32 only) */ unsigned long failsafe_address; /* entry EIP */ + unsigned long syscall_address; /* entry EIP (x86/64 only) */ + /* Bounce information for propagating an exception to guest OS. */ struct trap_bounce trap_bounce; -- 2.30.2